assume cs:code

code segment
    start:mov al, 30
          call checkAngle   ;检查角度值是否为设定的角度值。0~180且为0， 30， 60等。
          call showsin

 program_end: mov ax, 4c00h
              int 21h

  showsin:jmp short show
    
    table dw ag0, ag30, ag60, ag90, ag120, ag150, ag180
    ag0 db '0', 0
    ag30 db '0.5', 0
    ag60 db '0.866', 0
    ag90 db '1', 0
    ag120 db '0.5', 0
    ag150 db '0.866', 0
    ag180 db '0', 0

show:push bx
     push es
     push si
     mov bx, 0b800h
     mov es, bx

     mov ah, 0
     mov bl, 30
     div bl
     mov bl, al
     mov bh, 0
     add bx, bx
     mov bx, table[bx]  ;bx中存储ag0等标号的地址

     mov si, 160 * 12 + 40 * 2
shows:mov ah, cs:[bx]   ;取得其中第一个字节，即字符
      cmp ah, 0
      je showret
      mov es:[si], ah
      inc bx
      add si, 2
      jmp short shows

showret:pop si
        pop es
        pop bx
        ret

checkAngle:
           push ax
           push bx
           push cx
           mov cl, 7
           mov ah, al
           shr ah, cl   ;取得al的最高位，如果最高位为1，则为负数,负数不处理
           cmp ah, 1
           je program_end
           cmp al, 180
           ja program_end   ;大于180的数值不处理
           mov bh, 0
           mov bl, 30
           div bl
           cmp ah, 0
           jne program_end  ;除不尽的数值不处理
           pop cx
           pop bx
           pop ax
           ret
code ends
end start

